home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / gfx / misc / flamin11e.lha / Flaminator.oprx next >
Text File  |  1993-02-28  |  16KB  |  583 lines

  1. /*                      FLAMINATOR v1.1e                           */
  2. /*                                                                 */
  3. /*                    ©1993 Carmen Rizzolo                         */
  4. /*                                                                 */
  5. /*                     for OpalPaint v1.4+                         */
  6. /*                                                                 */
  7.  
  8. /* History:                                                        */
  9. /* v0.9   2/24/93  Just Starting, but the program is pretty much   */
  10. /*                 done, in my head.                               */
  11. /* v0.95  2/25/93  The script is done and (semi-)functional, but   */
  12. /*                 it's bumping into bugs.  Needs a little         */
  13. /*                 polishing.                                      */
  14. /* v1.0   2/25/93  Finally done and fairly stable.  Consult        */
  15. /*                 documentation for more info.                    */
  16. /* v1.0a  2/25/93  Fixed version number in startup requestor.      */
  17. /*                 Fixed Method number in one of these goofy       */
  18. /*                 REMARK thingies.  Nothing that matters.         */
  19. /* v1.0b  2/26/93  Corrected some spelling errors in the           */
  20. /*                 documentation.                                  */
  21. /* v1.1   2/26/93  Vastly icreased speed.  By optimizing the       */
  22. /*                 diffusion and smoothing process.  Now uses Blur */
  23. /*                 DrawMode instead of Smooth to avoid the cross-  */
  24. /*                 hatch look.  Then Uses Smooth DrawMode for top  */
  25. /*                 scanline to repair Blur's sloppiness.  Only one */
  26. /*                 or two Smooth passes are really all you'll ever */
  27. /*                 need now.                                       */
  28. /*                 Also, the flames seem to look better now.       */
  29. /* v1.1b 2/26/93   Now only performs diffuse and blur operations   */
  30. /*                 from upper-left corner to brush-size + 25       */
  31. /*                 pixels.                                         */
  32. /* v1.1c 2/27/93   Now only performs diffuse and blur operations   */
  33. /*                 from upper-left of brush to lower-left of brush */
  34. /*                 MUCH faster.                                    */
  35. /* v1.1d 2/27/93   Speeded it up a bit more.  I don't think I can  */
  36. /*                 squeeze much more speed out of this thing!      */
  37. /* v1.1e 2/28/93   Do you want to go FASTER??! :)  I did it again. */
  38. /*                 It's turbo-charged, especially for Hi-Res work. */
  39. /*                 I also changed the sample images.  I think it   */
  40. /*                 makes a bit of a better animation now.          */
  41.  
  42. /*  See documentation for more information                         */
  43.  
  44. /* Initialization of variables.  Don't touch unless you know what
  45.    you are doing. */
  46. ROOT = 'pic.'
  47. ZERO = '0'
  48. Options Results
  49. Address 'OpalPaint_Rexx'
  50.  
  51. /* Give the option to abort */
  52. AskBool 'FLAMINATOR ©1993 Carmen Rizzolo - v1.1e\nOK to continue, Cancel to abort.'
  53. If Result = 0 Then Exit
  54.  
  55. /* Ask method */
  56. AskInt 0 1 0 'Choose BACKGROUND source method:\n0 = Static  1 = Animated\nSee documentation for more information.'
  57. If RC = 5 Then Do
  58.     Okay 'Exiting...'
  59.     Exit
  60.     End
  61. Method = Result
  62.  
  63. /* Get flame colour */
  64. AskInt 1 6 1 'Choose flame colour:\n1 = Normal  2 = Yellow  3 = Red  4 = Blue  5 = Green  6 = Purple'
  65. If RC = 5 Then Do
  66.     Okay 'Exiting...'
  67.     Exit
  68.     End
  69. FlameColour = Result
  70.  
  71. /* Ask flame size (Diffuse value) */
  72. AskInt 1 31 11 'Choose flame size:\nFrom 1 to 31.'
  73. If RC = 5 Then Do
  74.     Okay 'Exiting...'
  75.     Exit
  76.     End
  77. FlameSize = Result
  78.  
  79. /* Convert FlameSize into an odd number if needed */
  80. If FlameSize/2 = FlameSize%2 Then FlameSize = FlameSize - 1
  81.  
  82. /* Ask smooth value (# of smoothing passes) */
  83. AskInt 1 3 1 'Choose flame smoothing:\nFrom 1 to 3.\nThis is the number of smooth passes.'
  84. If RC = 5 Then Do
  85.     Okay 'Exiting...'
  86.     Exit
  87.     End
  88. SmoothValue = Result
  89.  
  90. /* Ask intensity (# of times the flame brush is stamped) */
  91. AskInt 1 4 1 'Choose flame intensity.'
  92. If RC = 5 Then Do
  93.     Okay 'Exiting...'
  94.     Exit
  95.     End
  96. FlameIntensity = Result
  97.  
  98. /* Get background source image(s) pathname: */
  99. Do Forever
  100.     Askstring 'Enter the pathname of your BACKGROUND source image(s).\nEnter pathname only, and WITHOUT final "/"\nExample: "DH0:Torch/" = wrong  "DH0:Torch" = right'
  101.     If RC = 5 Then Do
  102.         Okay 'Exiting...'
  103.         Exit
  104.         End
  105.     If Result ~= "" Then Do
  106.         BackgroundSource = Result
  107.         Finder = Exists(BackgroundSource || '/')
  108.         If Finder = 1 Then Do
  109.             Leave
  110.             End
  111.         End
  112.     Okay 'Drawer not found!  Check your spelling.'
  113.     End
  114.  
  115. /* Check for first image of Backgrounds for Method 0 */
  116. If Method = 0 Then Do
  117.     Finder = Exists(BackgroundSource || '/pic.0001')
  118.     If Finder = 0 Then Do
  119.         Okay 'FATAL ERROR!  There must be at least a "pic.0001" image\nin your background source drawer when using method 1.\nExiting...'
  120.         Exit
  121.         End
  122.     End
  123.  
  124. /* Get flame source images pathname: */
  125. Do Forever
  126.     Askstring 'Enter the pathname of your FLAME source images.\nEnter pathname only, and WITHOUT final "/"\nExample: "DH0:Torchflame/" = wrong  "DH0:Torchflame" = right'
  127.     If RC = 5 Then Do
  128.         Okay 'Exiting...'
  129.         Exit
  130.         End
  131.     If Result ~= "" Then Do
  132.         FlameSource = Result
  133.         If FlameSource = BackgroundSource Then Do
  134.             Okay 'FATAL ERROR!  The FLAME source images can NOT be in\nthe same drawer as the BACKGROUND source images.\nPlease make sure you are REALLY ready to launch this script.\nRead the documentation for more info.  Exiting...'
  135.             Exit
  136.             End
  137.         Finder = Exists(FlameSource || '/')
  138.         If Finder = 1 Then Do
  139.             Leave
  140.             End
  141.         End
  142.     Okay 'Drawer not found!  Check your spelling.'
  143.     End
  144.  
  145. /* Get starting FLAME frame number */
  146. AskInt 1 9998 1 'Enter starting FLAME frame number as a normal number\nExamples:\n1 = Right  pic.0001 = Wrong  0001 = Wrong\nSee documentation for more information.'
  147. If RC = 5 Then Do
  148.     Okay 'Exiting...'
  149.     Exit
  150.     End
  151. StartFrame = Result
  152.  
  153. /* Get Ending FLAME frame number */
  154. Do Forever
  155.     AskInt 1 9999 20 'Enter Ending FLAME frame number as a normal number\nExamples:\n1 = Right  pic.0001 = Wrong  0001 = Wrong\nSee documentation for more information.'
  156.     If RC = 5 Then Do
  157.         Okay 'Exiting...'
  158.         Exit
  159.         End
  160.     EndFrame = Result
  161.     If EndFrame >= StartFrame Then Leave
  162.     Okay 'Ending FLAME frame number should be equal to or higher than\nStarting FLAME frame number.  Try again.'
  163.     End
  164.  
  165. /* Get Destination drawer for Method 0*/
  166.  
  167. If Method = 0 Then Do
  168.     AskString 'Enter pathname for "flamed" destination images.\nWITHOUT final "/"\nExample: "DH0:Torchflame/" = wrong  "DH0:Torchflame" = right'
  169.     If RC = 5 Then Do
  170.         Okay 'Exiting...'
  171.         Exit
  172.         End
  173.     Do Forever
  174.         If Result ~= "" Then Do
  175.             FlameDest = Result
  176.             Finder = Exists(FlameDest || '/')
  177.             If Finder = 1 Then Do
  178.                 Leave
  179.                 End
  180.             If Finder = 0 Then Do
  181.                 AskBool 'Drawer not found.  Create one?\n[Cancel = No, lemme try agian]'
  182.                 If Result = 1 Then Do
  183.                     AskBool 'You typed:\n' || FlameDest || '\nIs this the drawer you want?\n[Cancel = No, lemme try agian]'
  184.                     If Result = 1 Then Do
  185.                         Address Command
  186.                         'Makedir ' || FlameDest
  187.                         Address 'OpalPaint_Rexx'
  188.                         Leave
  189.                         End
  190.                     End
  191.                 End
  192.             End
  193.         AskString 'Drawer not found!  Try Again.'
  194.             If RC = 5 Then Do
  195.             Okay 'Exiting...'
  196.             Exit
  197.             End
  198.  
  199.         End
  200.     If FlameDest = BackgroundSource Then Do
  201.         Okay 'FATAL ERROR!  The FLAMED destination images can NOT be in\nthe same drawer as the BACKGROUND source images.\nPlease make sure you are REALLY ready to launch this script.\nRead the documentation for more info.  Exiting...'
  202.         Exit
  203.         End
  204.     End
  205.  
  206.  
  207. /* Ask if user wants to overwrite original files for Method 1*/
  208. If Method = 1 Then Do
  209.     AskBool 'Overwrite original Background source images with the new\n"flamed" images? [Cancel = No]'
  210.     Overwrite = Result
  211.     If Overwrite = 0 Then Do
  212.         AskString 'Enter pathname for "flamed" destination images.\nWITHOUT final "/"\nExample: "DH0:Torchflame/" = wrong  "DH0:Torchflame" = right'
  213.         If RC = 5 Then Do
  214.         Okay 'Exiting...'
  215.         Exit
  216.         End
  217.     End
  218.     If Overwrite = 0 Then Do Forever
  219.         If Result ~= "" Then Do
  220.             FlameDest = Result
  221.             Finder = Exists(FlameDest || '/')
  222.             If Finder = 1 Then Do
  223.                 Leave
  224.                 End
  225.             If Finder = 0 Then Do
  226.                 AskBool 'Drawer not found.  Create one?\n[Cancel = No, lemme try agian]'
  227.                 If Result = 1 Then Do
  228.                     AskBool 'You typed:\n' || FlameDest || '\nIs this the drawer you want?\n[Cancel = No, lemme try agian]'
  229.                     If Result = 1 Then Do
  230.                         Address Command
  231.                         'Makedir ' || FlameDest
  232.                         Address 'OpalPaint_Rexx'
  233.                         Leave
  234.                         End
  235.                     End
  236.                 End
  237.             End
  238.         AskString 'Drawer not found!  Try Again.'
  239.             If RC = 5 Then Do
  240.             Okay 'Exiting...'
  241.             Exit
  242.             End
  243.  
  244.         End
  245.     End
  246.  
  247. /* Here we go!!  I'll take it from here. */
  248. Address 'OpalPaint_Rexx'
  249. Okay 'Here we go.'
  250.  
  251. Busy
  252. GetPrefs
  253. Panic
  254.  
  255. Do A = StartFrame to EndFrame
  256.  
  257.     /* Get IFF Variables */
  258.     Iff = Root || Zero || Zero || Zero || A
  259.     If A < 10000 & A > 999 Then Iff = Root || A
  260.     If A < 1000 & A > 99 Then Iff = Root || Zero || A
  261.     If A < 100 & A > 9  Then Iff = Root || Zero || Zero || A
  262.  
  263.     /* Search for next FLAME frame and load*/
  264.     DisplayStatus 'Find ' || A
  265.     Finder = Exists(FlameSource || '/' || Iff)
  266.     If Finder = 1 Then Do
  267.         Load Flamesource || '/' || Iff
  268.         PageSize
  269.         Parse Var Result X2 Y2
  270.  
  271.         /* Set pots */
  272.         SetPot 1 0 0 0
  273.         SetPot 2 255 255 255
  274.  
  275.         If FlameColour = 1 Then Do
  276.             DisplayStatus 'Normal CLR'
  277.             SetPot 3 255 240 0
  278.             SetPot 4 240 127 0
  279.             SetPot 5 240 0 0
  280.             SetPot 6 120 0 0
  281.             End
  282.         If FlameColour = 2 Then Do
  283.             DisplayStatus 'Yellow CLR'
  284.             SetPot 3 255 240 0
  285.             SetPot 4 210 180 0
  286.             SetPot 5 165 119 0
  287.             SetPot 6 120 58 0
  288.             End
  289.         If FlameColour = 3 Then Do
  290.             DisplayStatus 'Red CLR'
  291.             SetPot 3 255 123 0
  292.             SetPot 4 255 0 0
  293.             SetPot 5 188 0 0
  294.             SetPot 6 120 0 0
  295.             End
  296.         If FlameColour = 4 Then Do
  297.             DisplayStatus 'Blue CLR'
  298.             SetPot 3 0 214 255
  299.             SetPot 4 0 86 255
  300.             SetPot 5 0 43 188
  301.             SetPot 6 0 0 120
  302.             End
  303.         If FlameColour = 5 Then Do
  304.             DisplayStatus 'Green CLR'
  305.             SetPot 3 90 255 90
  306.             SetPot 4 0 255 0
  307.             SetPot 5 0 188 0
  308.             SetPot 6 0 120 0
  309.             End
  310.         If FlameColour = 6 Then Do
  311.             DisplayStatus 'Purple CLR'
  312.             SetPot 3 255 0 235
  313.             SetPot 4 255 0 209
  314.             SetPot 5 172 0 165
  315.             SetPot 6 88 0 120
  316.             End
  317.         SetPot 7 1 1 1
  318.  
  319.  
  320.         DisplayStatus 'Initialze'
  321.         Trans 0
  322.         Texture 0
  323.         FillMode SOLID
  324.         SetDrawMode 1
  325.         SmoothPaper
  326.         ActiveNozzle 1
  327.         MaskSten 0
  328.         ColSten 1
  329.  
  330.         /* Check for special brightness code */
  331.         If Method = 0 Then Do
  332.             DisplayStatus 'Code Check'
  333.             MethodCode = 1
  334.             ReadPixel 0 0
  335.             Parse Var Result R G B
  336.             If R > 0 Then MethodCode = 1
  337.             ReadPixel 1 0
  338.             Parse Var Result R G B
  339.             If R > 0 Then MethodCode = 2
  340.             ReadPixel 2 0
  341.             Parse Var Result R G B
  342.             If R > 0 Then MethodCode = 3
  343.             ReadPixel 3 0
  344.             Parse Var Result R G B
  345.             If R > 0 Then MethodCode = 4
  346.             ReadPixel 4 0
  347.             Parse Var Result R G B
  348.             If R > 0 Then MethodCode = 5
  349.             End
  350.  
  351.         /* Cleanup corner */
  352.         ActivePot 1
  353.         StenEnable 0
  354.         Line 0 0 5 0
  355.  
  356.         /* Turn on Stencil to fix white to 255 255 255 */
  357.         DisplayStatus 'Fix White'
  358.         SetColSten 1 0 0 0 0 0 0 0
  359.         EnableColEntry 1 1
  360.         StenEnable 0
  361.         ActivePot 2
  362.         Point 0 0
  363.         FreeHand 0 0
  364.         LastPoint 0 0
  365.         StenEnable 1
  366.         RectCut 0 0 X2 Y2
  367.         StenEnable 0
  368.         Handle 0 0
  369.         ColourSource 'PAINTPOT'
  370.         PutBrush 0 0
  371.         ColourSource 'MULTICOLOUR'
  372.  
  373.         BrushSize
  374.         parse var Result BX2 BY2
  375.  
  376.  
  377.         /* Pick up White flame image */
  378.         ActiveNozzle 1
  379.         NozzleSize 1 1
  380.         ActivePot 1
  381.         Point 0 0
  382.         FreeHand 0 0
  383.         LastPoint 0 0
  384.         StenEnable 1
  385.         DisplayStatus 'Get Brush'
  386.         ActiveBrush 2
  387.         RectCut 0 0 BX2 BY2
  388.         Handle 0 0
  389.  
  390.         /*Get upper-left Brush Sizer */
  391.         BrushSize
  392.         parse var Result BX1 BY1
  393.  
  394.         BX1 = BX2 - BX1
  395.         BY1 = BY2 - BY1
  396.         BX1 = BX1 - (FlameSize + 7)
  397.         BY1 = BY1 - (FlameSize + 7)
  398.         If BX1 < 0 Then BX1 = 0
  399.         If BY1 < 0 Then BY1 = 0
  400.  
  401.         BX2 = BX2 + (FlameSize + 7)
  402.         BY2 = BY2 + (FlameSize + 7)
  403.         If BX2 > X2 Then BX2 = X2
  404.         If BY2 > Y2 Then BY2 = Y2
  405.         StenEnable 0
  406.  
  407.         /* Clean up corner again */
  408.         StenEnable 0
  409.         ActivePot 1
  410.         ActiveNozzle 1
  411.         NozzleSize 0 0
  412.         Point 0 0
  413.         FreeHand 0 0
  414.         LastPoint 0 0
  415.         Point BX1 BY1
  416.         FreeHand BX1 BY1
  417.         LastPoint BX1 BY1
  418.  
  419.         /* Diffuse White flame image */
  420.         DisplayStatus 'Diffuse 1'
  421.         SetSpare 1 Diffuse
  422.         SetDrawMode 19 FlameSize
  423.         SetDrawMode 19 FlameSize
  424.         SolidRect BX1 BY1 BX2 BY2
  425.  
  426.         /* Add 'Handle Dot' */
  427.         DisplayStatus 'Handle Dot'
  428.         SetDrawMode 1
  429.         ActivePot 7
  430.         ActiveNozzle 1
  431.         NozzleSize 1 1
  432.         Point BX1 BY1
  433.         FreeHand BX1 BY1
  434.         LastPoint BX1 BY1
  435.  
  436.         /* Pick up White flame image */
  437.         StenEnable 1
  438.         DisplayStatus 'Get Brush'
  439.         ActiveBrush 1
  440.         RectCut BX1 BY1 X2 Y2
  441.         Handle 0 0
  442.  
  443.         StenEnable 0
  444.         ActiveNozzle 1
  445.         NozzleSize 1 1
  446.         Point BX1 BY1
  447.         FreeHand BX1 BY1
  448.         LastPoint BX1 BY1
  449.  
  450.         /* Outline Brush with flame colours */
  451.         ActiveBrush 1
  452.         ActivePot 3
  453.         NotBusy
  454.         Key 'o'
  455.         ActivePot 4
  456.         Key 'o'
  457.         Key 'o'
  458.         ActivePot 5
  459.         Key 'o'
  460.         Key 'o'
  461.         ActivePot 6
  462.         Key 'o'
  463.         Busy
  464.  
  465.         /* Stamp coloured brush down */
  466.         DisplayStatus 'stamping'
  467.         Handle 6 6
  468.         StenEnable 0
  469.         ColourSource 'MULTICOLOUR'
  470.         PutBrush BX1 BY1
  471.  
  472.         /* Cleanup corner */
  473.         ActivePot 1
  474.         StenEnable 0
  475.         NewBX1 = BX1 - 6
  476.         If NewBX1 < 0 Then NewBX1 = 0
  477.         NewBY1 = BY1 - 6
  478.         If NewBY1 < 0 Then NewBY1 = 0
  479.         SolidRect NewBX1 NewBY1 (BX1 + 6) (BY1 + 6)
  480.  
  481.         /* Diffuse Coloured flame image */
  482.         DisplayStatus 'Diffuse 2'
  483.         SetDrawMode 19 FlameSize
  484.         SetDrawMode 19 FlameSize
  485.         SolidRect BX1 BY1 BX2 BY2
  486.  
  487.         /* Smooth image */
  488.         ActivePot 1
  489.         ActiveNozzle 1
  490.         NozzleSize 1 1
  491.         SetSpare 1 Blur
  492.         SetDrawMode 19 100
  493.         SetDrawMode 19 100
  494.         Do Smoothy = 1 to SmoothValue
  495.             SolidRect BX1 BY1 BX2 BY2
  496.             End
  497.         SetDrawMode 16 100
  498.         SetDrawMode 16 100
  499.         Do SmoothyB = 1 to 4
  500.             Line NewBX1 0 BX2 0
  501.             End
  502.  
  503.         /* Repair Handle Dot */
  504.         SetDrawMode 1
  505.         ActivePot 7
  506.         Point BX1 BY1
  507.         FreeHand BX1 BY1
  508.         LastPoint BX1 BY1
  509.  
  510.         /* Pick up finished flame brush! */
  511.         ActiveBrush 1
  512.         RectCut BX1 BY1 BX2 BY2
  513.         Handle 0 0
  514.  
  515.         /* Method 0 */
  516.         If Method = 0 Then Do
  517.             If MethodCode = 1 Then Do
  518.                 Load BackgroundSource || '/pic.0001'
  519.                 End
  520.             If MethodCode = 2 Then Do
  521.                 Finder = Exists(BackgroundSource || '/pic.0002')
  522.                 If Finder = 0 Then Load BackgroundSource || '/pic.0001'
  523.                 If Finder = 1 Then Load BackgroundSource || '/pic.0002'
  524.                 End
  525.             If MethodCode = 3 Then Do
  526.                 Finder = Exists(BackgroundSource || '/pic.0003')
  527.                 If Finder = 0 Then Load BackgroundSource || '/pic.0001'
  528.                 If Finder = 1 Then Load BackgroundSource || '/pic.0003'
  529.                 End
  530.             If MethodCode = 4 Then Do
  531.                 Finder = Exists(BackgroundSource || '/pic.0004')
  532.                 If Finder = 0 Then Load BackgroundSource || '/pic.0001'
  533.                 If Finder = 1 Then Load BackgroundSource || '/pic.0004'
  534.                 End
  535.             If MethodCode = 5 Then Do
  536.                 Finder = Exists(BackgroundSource || '/pic.0005')
  537.                 If Finder = 0 Then Load BackgroundSource || '/pic.0001'
  538.                 If Finder = 1 Then Load BackgroundSource || '/pic.0005'
  539.                 End
  540.             End
  541.  
  542.         /* Method 1 */
  543.         If Method = 1 Then Do
  544.             Finder = Exists(BackgroundSource || '/' || Iff)
  545.             If Finder = 0 Then Do
  546.                 Okay 'FATAL ERROR!  Background source image is missing!\nSorry, gotta exit.'
  547.                 Exit
  548.                 End
  549.             Load BackGroundSource || '\' || Iff
  550.             End
  551.  
  552.         /* Add Fire to image */
  553.         SetDrawMode 2 100
  554.         ActiveBrush 1
  555.         Handle 0 0
  556.         Do Loopsy = 1 to FlameIntensity
  557.             Putbrush BX1 BY1
  558.             End
  559.  
  560.         /* Save composited image for Method 0 */
  561.         If Method = 0 Then Do
  562.             Save FlameDest || '/' || Iff
  563.             End
  564.  
  565.         /* Save composited image for Method 1 */
  566.         If Method = 1 Then Do
  567.             If Overwrite = 0 Then Do
  568.                 Save FlameDest || '/' || Iff
  569.                 End
  570.             If Overwrite = 1 Then Do
  571.                 Save BackgroundSource || '/' || Iff
  572.                 End
  573.             End
  574.         End
  575.     End
  576.  
  577. /*All Done! */
  578.  
  579. Okay 'Operation Complete!  Go animate it and impress your friends!'
  580.  
  581. NotBusy
  582. Exit
  583.